<?php

namespace framework\libraries;

class Env
{
    private static $_instance = null;
    private $items = [];
    /**
     * Single constructor. 私有的构造方法
     */
    private function __construct() {}

    /**
     * @purpose: 创建__clone方法防止对象被复制克隆
     */
    private function __clone()
    {
        // E_USER_ERROR只能通过trigger_error($msg, E_USER_ERROR)手动触发。
        // E_USER_ERROR是用户自定义错误类型，可以被set_error_handler错误处理函数捕获，允许程序继续运行。
        // E_ERROR是系统错误，不能被set_error_handler错误处理函数捕获，程序会退出运行
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }


    /**
     * @return Single|Object 单例方法,用于访问实例的公共的静态方法
     */
    public static function getInstance()
    {
        if (!(self::$_instance instanceof self)) {

            self::$_instance = new self;
            $envFile = BasePath . '/.env';
            if (file_exists($envFile)) {
                self::$_instance->items = parse_ini_file($envFile);
            }
        }
        return self::$_instance;
    }

    public function get($key, $default = null)
    {
        $env = self::getInstance();
        if (isset($env->items[$key])) {
            return $env->items[$key];
        }
        return $default;
    }

    public static function loadEnv()
    {
        // 读取.env文件内容 
        $envFile = BasePath . '/.env';
        $contents = file_get_contents($envFile);

        // 将文件内容按行分割成数组 
        $lines = explode("\n", $contents);

        // 遍历每一行 
        foreach ($lines as $line) {
            // 忽略空行和注释行 
            $line = ltrim($line);
            if (empty($line) || strpos($line, '#') === 0) {
                continue;
            }

            // 解析键值对 
            list($key, $value) = explode('=', $line, 2);

            // 去除键和值两端的空格 
            $key = trim($key);
            $value = trim($value);

            // 将变量设置为环境变量 
            putenv("$key=$value");
        }
    }
}
